<?php

namespace App\Console\Commands;

use App\Service\Api\QrCodeService;
use chillerlan\QRCode\QRCode;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Carbon\Carbon;
use Zxing\QrReader;

class UpdateQrCodeExpireTime1 extends Command
{
    // 命令的名字和描述
    protected $signature   = 'qrcode:update-expire-time1';
    protected $description = '批量更新二维码过期时间为当前时间向后加10天，并更新sign参数到token中';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        // $filePath = public_path('img/a.jpg');
        // $filePath = storage_path('app/c.jpg'); // 临时存储路径
        // $filePath = storage_path('app/temp_qr_code'.'.jpg'); // 临时存储路径
        // $qrcode = new \Zxing\QrReader($filePath);  //图片路径
        // $text = $qrcode->text(); //返回识别后的文本
        // $result = $this->getQrcode('http://osstest.sx1211.com/img/sales/06/49/7c/06497c71055dd.jpg');
        // dd($text);
        // $uploadUrl = $this->getUploadUrl($filePath);
        // $result = $this->getQrcodeByUrl($uploadUrl);
        // dd($result);
        // $path='E:\phpEnv\www\web\exam-me\storage\app/temp_qr_code_9.jpg';
        // $result=$this->getUploadUrl($path);
        // dd($result);
        // dd(file_exists($path));

        $newExpireTime = Carbon::now()->addDays(1)->endOfDay()->timestamp;

        // 获取需要更新的二维码总数
        $total = DB::table('sx_sales_qr_codes')->where('id', '>=', 33623)->where('token', '')->count();

        // 如果没有记录，结束命令
        if ($total == 0) {
            $this->info('没有需要更新的二维码。');

            return;
        }
        // $domain = 'http://osstest.sx1211.com/';
        $domain = 'https://img.sx1211.com/';
        $list = [];
        // 创建一个进度条
        $this->output->progressStart($total);
        // 分批处理，避免一次性处理大量数据导致内存溢出
        DB::table('sx_sales_qr_codes')
          ->orderBy('id')
          ->where('id', '>=', 33623)
          ->where('token', '')
          ->chunkById(100, function ($qrCodes) use ($newExpireTime, $domain,&$list) {
              foreach ( $qrCodes as $qrCode ) {
                  try {
                      $imgUrl = $domain.$qrCode->qr_code_uri;

                      $qrCodeFile = $this->downloadQrCode($imgUrl, $qrCode->id);

                      $qrReader = new \Zxing\QrReader($qrCodeFile);

                      $qrText = $qrReader->text();

                      if (! $qrText) {
                          $uploadUrl = $this->getUploadUrl($qrCodeFile);
                          if (! $uploadUrl) {
                              $this->error("二维码读取失败，ID: {$qrCode->id}, 上传本地文件失败");
                          }
                          [$qrText, $errorMessage] = $this->getQrcodeByUrl($uploadUrl);
                          if (! $qrText) {
                              $this->error("二维码读取失败，ID: {$qrCode->id},接口也没有获取到链接:".$errorMessage);
                          }
                          continue;
                      }
                      // 每更新一条，进度条前进一格
                      $this->output->progressAdvance();

                      if ($qrText) {
                          $list[] = $qrText;
                      }

                      continue;

                      // $sign = $this->extractSignFromUrl($qrText);

                      if (! $sign) {
                          $this->error("二维码读取失败，ID: {$qrCode->id},没有提取出来token信息");
                          continue;
                      }

                      // 更新记录的过期时间和 token (sign)
                      DB::table('sx_sales_qr_codes')
                        ->where('id', $qrCode->id)
                        ->update([
                            'expire_time' => $newExpireTime,
                            'token'       => $sign,
                        ]);

                      // 每更新一条，进度条前进一格
                      $this->output->progressAdvance();

                  } catch (\Exception $e) {

                      $this->error("二维码读取失败，ID: {$qrCode->id}, 错误: ".$e->getMessage());
                  }
              }
          });

        dd($list);
        // 完成进度条
        $this->output->progressFinish();

        $this->info('所有二维码过期时间和token更新完毕！');
    }

    /**
     * 下载二维码到本地
     *
     * @param string $uri
     * @return string
     */
    private function downloadQrCode($uri, $id = 0)
    {
        $contents = file_get_contents($uri); // 下载二维码

        $path = storage_path('app/temp_qr_code_'.rand(0, 10).'.jpg'); // 临时存储路径

        file_put_contents($path, $contents);

        return $path;

        // return $this->getQrcodeImg($path,$id);
        // return $path;
    }

    /**
     * @param $filePath
     * @param $qrcodePath
     * @return mixed
     */
    public function getQrcodeImg($filePath, $qrcodePath)
    {
        $sourcePath = $filePath;
        // 检查文件类型
        // $sourceImage = imagecreatefrompng($sourcePath);
        try {
            // 载入图像
            $sourceImage = imagecreatefromjpeg($sourcePath);
        } catch (\Throwable $exception) {
            $sourceImage = imagecreatefrompng($sourcePath);
        }

        // 定义二维码所在的区域
        $x = 175; // 起始 x 坐标
        $y = 450; // 起始 y 坐标
        $width = 400; // 区域宽度
        $height = 400; // 区域高度

        // 创建一个新的图像资源
        $croppedImage = imagecreatetruecolor($width, $height);

        // 从原始图像中拷贝选定区域到新图像
        imagecopy($croppedImage, $sourceImage, 0, 0, $x, $y, $width, $height);

        // 增强对比度
        imagefilter($croppedImage, IMG_FILTER_CONTRAST, -15);

        // 锐化图像
        // imagefilter($croppedImage, IMG_FILTER_EDGEDETECT);
        // 保存增强后的图像
        imagejpeg($croppedImage, $qrcodePath);

        // 释放内存
        imagedestroy($sourceImage);
        imagedestroy($croppedImage);

        return $qrcodePath;

    }

    /**
     * 从URL中提取sign参数
     *
     * @param string $url
     * @return string|null
     */
    private function extractSignFromUrl($url)
    {
        // 解析 URL 并提取参数
        $parsedUrl = parse_url($url);
        if (isset($parsedUrl['query'])) {
            parse_str($parsedUrl['query'], $queryParams);

            return $queryParams['sign'] ?? null;
        }

        return null;
    }

    /**
     * 获取要进行接口请求的图片地址，目前通过裁剪
     * @param $qrCodeFile
     * @return mixed
     */
    public function getUploadUrl($qrCodeFile)
    {
        $path = 'upload/temp_qr_code.jpg';

        $this->getQrcodeImg($qrCodeFile, public_path($path));

        return 'https://exam.frp.wowoxia.club/'.$path;
    }

    /**
     * 通过第三方接口获取
     * @param $url
     * @return mixed|string
     */
    public function getQrcodeByUrl($url)
    {
        $service = new QrCodeService();
        $result = $service->readQRCode($url);
        $linkUrl = '';
        if ($result['code'] == 1) {
            $linkUrl = $result['qrurl'];
        }

        return [$linkUrl, $result['msg'] ?? ''];
    }
}
